#ifndef __HMI_UI_H__
#define __HMI_UI_H__

#include "main.h"
#include "debugTools.h"
#include <stdio.h>
#include <string.h>
#include "usart.h"
#include <stdarg.h>

// 串口发送
/* 定义环形缓冲区结构 */
#define MAX_CMD_QUEUE_SIZE 10
#define MAX_CMD_LENGTH 500
typedef struct
{
    uint8_t buffer[MAX_CMD_QUEUE_SIZE][MAX_CMD_LENGTH];
    uint16_t lengths[MAX_CMD_QUEUE_SIZE];
    uint8_t head;
    uint8_t tail;
    uint8_t count;
} UartCmdQueue_t;
static UartCmdQueue_t cmdQueue = {0};
static volatile uint8_t uart_dma_busy = 0;
static uint8_t current_buffer[MAX_CMD_LENGTH]; // 当前DMA正在传输的缓冲区
// 串口接收
/* 环形缓冲区配置 */
#define UART_RX_BUFFER_SIZE 256
static uint8_t rxBuffer[UART_RX_BUFFER_SIZE];
static volatile uint16_t rxHead = 0;
static volatile uint16_t rxTail = 0;
static volatile uint8_t rxBusy = 0;
/* 事件回调定义 */
#define MAX_CHANNELS 16
// 回调函数类型定义 - 接收通道号和解析字符串
typedef void (*ChannelCallback)(int channel, const char *string);
typedef struct
{
    int channel;
    ChannelCallback callback;
} ChannelHandler_t;
static ChannelHandler_t channelHandlers[MAX_CHANNELS];
static uint8_t numChannelHandlers = 0;
/* 帧标识 */
#define FRAME_START_STR "@$c:"
#define FRAME_END_CHAR '#'

HAL_StatusTypeDef HMI_Printf(const char *format, ...);
void UART_DMA_TxCompleteCallback(UART_HandleTypeDef *huart);
void HMI_Rx_Init(UART_HandleTypeDef *huart);
int HMI_Register_Call(int channel, ChannelCallback callback);
void HMI_Process(UART_HandleTypeDef *huart);
#endif

/*
陶晶驰串口通信库，基于stm32 hal 库实现
优化串口发送，使用dma加环形缓冲区，非阻塞发送
使用HAL库的DMA传输功能来实现非阻塞的串口发送
使用环形缓冲区来存储待发送的命令
使用一个标志位来指示DMA是否正在传输数据
在DMA传输完成时，回调函数会被调用，处理下一个命令
格式化并发送命令的函数为HMI_Printf
使用方法：HMI_Printf("t6.txt=\"%.2f\"\xff\xff\xff", distance);
使用方法：HMI_Printf("line %d,%d,%d,%d,BLACK\xff\xff\xff", last_point.x, last_point.y, now_point.x, now_point.y);


*/

/* @brief 串口接收系统
 * 该系统使用DMA和中断来接收数据，并使用环形缓冲区来存储接收到的数据
 * 支持多通道数据解析和回调函数注册
 * 使用方法：
 *          初始化： HMI_Rx_Init(&huart2);  // 使用 USART2
 *          HMI_Register_Call(channel, callback);
 * // 在您自己的HAL回调函数中
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    HMI_Process(huart);
}

*/